const Cesium =window.Cesium
export default class U3DTile{
    _viewer:any
    constructor(viewer){
    this._viewer=viewer
    }
    add(url){
        try {
            let viewer=this._viewer
            var tileset = new Cesium.Cesium3DTileset({
              url: url,
              skipLevelOfDetail: true,
              baseScreenSpaceError: 1024,
              skipScreenSpaceErrorFactor: 16,
              skipLevels: 1,
              immediatelyLoadDesiredLevelOfDetail: false,
              loadSiblings: false,
              cullWithChildrenBounds: true,
            });
            
            viewer.scene.primitives.add(tileset);
            tileset.tileLoad.addEventListener(function (e) {
 
            });
          } catch (error) {
            console.log(error);
          }     
          return tileset;
    }
    slopeAnalyseFor3dtile(tileSet:any){

      var customShader = new Cesium.CustomShader({
        // lightingModel: Cesium.LightingModel.UNLIT,
        //  lightingModel: Cesium.LightingModel.PBR,
        //设置变量，由顶点着色器传递给片元着色器
        varyings: {
          v_normalMC: Cesium.VaryingType.VEC3,
          v_slope: Cesium.VaryingType.FLOAT,
          // v_st: Cesium.VaryingType.VEC3
        },
        //外部传给顶点着色器或者片元着色器
        // uniforms: {
        //   u_texture: {
        //     value: new Cesium.TextureUniform({
        //       url: '/Assets/Images/buildWall.jpg'
        //     }),
        //     type: Cesium.UniformType.SAMPLER_2D
        //   },
        //    u_texture1: {
        //     value: new Cesium.TextureUniform({
        //       url: '/Assets/Images/buildWall1.jpg'
        //     }),
        //     type: Cesium.UniformType.SAMPLER_2D
        //   }
        // },
       //贴纹理
       //顶点着色器
       //将法向量从顶点着色器设置变量传给片元着色器
       vertexShaderText: `
       void vertexMain(VertexInput vsInput, inout czm_modelVertexOutput vsOutput) {
           v_normalMC = vsInput.attributes.normalMC;
           // 计算坡度，并存储到varying变量中
           v_slope = acos(dot(normalize(v_normalMC), vec3(0.0,0.0,1.0)));
           // ...
       }`,

   fragmentShaderText: `
   void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {
    float width = 37.0;
    float height = 40.0;

    // 根据坡度决定颜色
    if (v_slope < 0.1) {
        material.diffuse = vec3(1.0, 0.0, 0.0);  // 绿色
    } else if (v_slope < 0.15) {
        material.diffuse = vec3(1.0, 0.5, 0.0);  // 黄色
    } else if (v_slope < 0.2) {
        material.diffuse = vec3(1.0, 1.0, 0.0);  // 黄色
    } else if (v_slope < 0.25) {
        material.diffuse = vec3(0.0, 1.0, 0.0);  // 黄色
    } else if (v_slope < 0.3) {
        material.diffuse = vec3(0.0, 1.0, 1.0);  // 黄色
    } else {
        material.diffuse = vec3(1.0, 0.0, 0.0);  // 红色
    }
}

   `
      })
      tileSet.customShader = customShader
    
    }
    setTexctureFor3dtile(tileSet:any){
      tileSet.style = new Cesium.Cesium3DTileStyle({
        color : {
            evaluateColor : function(feature, result) {
                var batchId = feature.getProperty('_BATCHID');
                console.log(batchId,'batchId');
                
                if (batchId > 2) {
                    return Cesium.Color.clone(Cesium.Color.WHITE, result);
                } else {
                    return Cesium.Color.clone(Cesium.Color.BLACK, result);
                }
            }
        }
    });
    
      // var customShader = new Cesium.CustomShader({
      //   varyings: {
      //     v_batchId: Cesium.VaryingType.INT,
      //   },
      //   uniforms: {
      //     u_texture: {
      //       value: new Cesium.TextureUniform({
      //         url: 'http://192.168.1.7/tiles/image/texture1.png'
      //       }),
      //       type: Cesium.UniformType.SAMPLER_2D
      //     },
      //     u_texture1: {
      //       value: new Cesium.TextureUniform({
      //         url: 'http://192.168.1.7/tiles/image/texture.png'
      //       }),
      //       type: Cesium.UniformType.SAMPLER_2D
      //     }
      //   },
      //   vertexShaderText: `
      //     void vertexMain(VertexInput vsInput, inout czm_modelVertexOutput vsOutput) {
      //       v_batchId = vsInput.attributes._BATCHID;
      //     }`,
      //   fragmentShaderText: `
      //     void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {
      //       vec2 uv = fsInput.attributes.st; // 这里需要根据你的模型自己计算uv坐标
      //       if (mod(float(v_batchId), 2.0) < 1.0) {
      //         material.diffuse = texture2D(u_texture, uv).rgb;
      //       } else {
      //         material.diffuse = texture2D(u_texture1, uv).rgb;
      //       }
      //     }`
      // })
      
      // tileSet.customShader = customShader
    
    }
}